package cn.edu.jxust.common.domain.web.api.account;

import cn.edu.jxust.common.domain.dto.AccountRoleVo;
import cn.edu.jxust.common.domain.dto.AccountVo;
import cn.edu.jxust.common.domain.dto.PasswordVo;
import cn.edu.jxust.common.domain.dto.SlfInfoVo;
import cn.edu.jxust.common.response.Result;
import cn.edu.jxust.core.infrastructure.util.Const;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;

/**
 * @author QiuKangming
 * @version 1.0
 * @description
 * @since 2020/09/15 14:13
 */

@RequestMapping("/api/account")
public interface IAccountController {

    /**
     * 新增的用户默认角色 id 是0, 且默认是禁用的(status = 0), 需要分配角色之后, 该
     * 账户才有用, 所以新增账户的时候, 应该手动把 status 置为0, 默认账户密码是 123456
     * @param accountVo 账户视图对象
     * @param result 绑定结果集
     * @return Result
     */
    @PostMapping
    @RequiresPermissions("account:add")
    Result addAccount(@RequestBody @Validated AccountVo accountVo, BindingResult result);

    /**
     * 删除用户信息, 根据传过来的用户的 id , 进行删除
     * @param userId 用户id号
     * @return Result
     */
    @DeleteMapping("/{userId}")
    @RequiresPermissions("account:del")
    Result delAccount(@PathVariable("userId") Integer userId);

    /**
     * 批量删除用户信息
     * @param userIdsStr 用户id组成的字符串, 以逗号分隔
     * @return Result
     */
    @DeleteMapping("/batch")
    @RequiresPermissions("account:del")
    Result delAccountBatch(@RequestParam @Validated String userIdsStr);

    /**
     * 修改用户信息
     * @param accountVo 账户视图对象
     * @param result 绑定结果集
     * @return Result
     */
    @PutMapping
    @RequiresPermissions("account:edit")
    Result modifyAccount(@RequestBody AccountVo accountVo, BindingResult result);

    /**
     * 分页查询或者条件查询
     * @param page 第几页
     * @param size 一页数据量
     * @param request 请求体
     * @return Result
     */
    @GetMapping
    @RequiresPermissions("account:list")
    Result findAccountListOrQuality(@RequestParam(value = "page", defaultValue = Const.DEFAULT_PAGE_NUMBER) Integer page,
                                    @RequestParam(value = "size", defaultValue = Const.DEFAULT_PAGE_SIZE) Integer size,
                                    HttpServletRequest request);

    /**
     * 给账户分配角色: 更改账户的 role_id 字段, 需要传入的参数 用户id,
     * 角色id, 需要判断当前角色可以操作的角色有哪些
     * @param accountRoleVo 账户视图对象
     * @param result 绑定结果集
     * @return Result
     */
    @PutMapping("/role")
    @RequiresPermissions("account:role")
    Result toAccountRole(@RequestBody @Validated AccountRoleVo accountRoleVo, BindingResult result);

    /**
     * 重置用户密码
     * @param username 用户名
     * @return Result
     */
    @GetMapping("/resetpwd")
    @RequiresPermissions("account:resetpwd")
    Result resetPwd(@RequestParam String username);

    /**
     * 修改个人信息
     * @param slfInfo 个人信息实体
     * @param result 绑定结果
     * @return Result
     */
    @PutMapping("/self")
    Result modifySelf(@RequestBody @Validated SlfInfoVo slfInfo, BindingResult result);

    /**
     * 修改个人密码
     * @param passwordVo 密码对象视图对象
     * @param result 绑定视图对象
     * @return Result
     */
    @PutMapping("/self/pwd")
    Result modifySelfPwd(@RequestBody @Validated PasswordVo passwordVo, BindingResult result);
}
